package top.wshape1.shiziapi.project.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import top.wshape1.shiziapi.common.domain.CommonUser;
import top.wshape1.shiziapi.common.domain.vo.PageVo;
import top.wshape1.shiziapi.project.domain.Project;
import top.wshape1.shiziapi.project.domain.vo.ProjectVo;

import java.util.List;

/**
 * @author Wshape1
 * @description 针对表【t_project】的数据库操作Service
 * @since 2023-09-12 15:40:51
 */
public interface ProjectService extends IService<Project> {


    /**
     * 获取用户拥有的项目信息
     *
     * @param id
     * @param page
     * @param limit
     * @param keyword
     * @return
     */
    PageVo projectListPageMy(Long id, Long page, Long limit, String keyword);

    /**
     * 获取用户参与的项目
     *
     * @param id
     * @param page
     * @param limit
     * @param keyword
     * @return
     */
    PageVo projectListPageHis(Long id, Long page, Long limit, String keyword);

    /**
     * 创建项目
     *
     * @param userId
     * @param projectVo
     */
    void createProject(Long userId, ProjectVo projectVo);

    /**
     * 修改项目信息
     *
     * @param userId
     * @param projectVo
     * @param file
     */
    void modifyProject(Long userId, @Validated ProjectVo projectVo, MultipartFile file);

    /**
     * 获取项目成员列表
     *
     * @param user
     * @param projectId
     * @param page
     * @param limit
     * @return
     */
    PageVo getProjectMemberPage(CommonUser user, String projectId, Long page, Long limit);

    /**
     * 删除项目
     *
     * @param id
     * @param projectId
     */
    void deleteProject(Long id, Long projectId);

    /**
     * 发送 邀请成员 消息
     *
     * @param userId
     * @param userName
     * @param projectId
     * @param memberId
     */
    void inviteMember(Long userId, String userName, Long projectId, Long memberId);

    /**
     * 从项目中踢出一位成员
     *
     * @param id
     * @param projectId
     * @param memberId
     */
    void kickMember(Long id, Long projectId, Long memberId);

    /**
     * 接受邀请
     *
     * @param msgId
     * @param memberId
     * @param userBase64
     */
    void acceptInvite(Long msgId, Long memberId, String userBase64);

    /**
     * 拒绝邀请
     *
     * @param msgId
     * @param commonUser
     * @param userBase64
     */
    void rejectInvite(Long msgId, CommonUser commonUser, String userBase64);

    /**
     * 通过Id获取项目的名字
     *
     * @param projectId
     * @return
     */
    String getNameById(Long projectId);

    /**
     * 判断是否有权限操作某项目
     *
     * @param projectId
     * @param userId
     * @return
     */
    boolean hasPermissionToEdit(Long projectId, Long userId);

    /**
     * 获取所有公开的项目id
     *
     * @return
     */
    List<Long> getPublicProjectIds();

}
